home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 201-225 / disk_218 / mandel / src / palette.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  37KB  |  1,554 lines

  1. #define DEBUG
  2.  
  3. /*
  4.           MAND.H -- The Constants and Definitions
  5.          Mandelbrot Self-Squared Dragon Generator
  6.             For the Commodore Amiga
  7.              Version 2.01
  8.  
  9.               Accompanied MAND.C
  10.  
  11.          Copyright (c) 1985, Robert S. French
  12.           Placed in the Public Domain
  13.  
  14.           Vastly Enhanced by =RJ Mical=  1985
  15.         Manxified by Olaf Seibert  1987
  16.  
  17. This program may be distributed free of charge as long as the above
  18. notice is retained.
  19.  
  20. */
  21.  
  22.  
  23. /*-------------------*/
  24. /* Lots of includes! */
  25.  
  26. #include <exec/types.h>
  27. #include <exec/memory.h>
  28. /* #include <exec/tasks.h> */
  29. /* #include <exec/libraries.h> */
  30. /* #include <exec/devices.h> */
  31. /* #include <devices/keymap.h> */
  32. /* #include <graphics/copper.h> */
  33. /* #include <graphics/display.h> */
  34. /* #include <graphics/gfxbase.h> */
  35. /* #include <graphics/text.h> */
  36. /* #include <graphics/view.h> */
  37. /* #include <graphics/gels.h> */
  38. /* #include <graphics/regions.h> */
  39. /* #include <hardware/blit.h> */
  40. #include <intuition/intuition.h>
  41. /* #include <intuition/intuitionbase.h> */
  42. #ifdef DEBUG
  43. #  include <stdio.h>
  44. #  undef STATIC /* Empty string */
  45. #  define STATIC
  46. #endif
  47.  
  48. /* #include <libraries/dos.h> */
  49.  
  50. /* #include <workbench/workbench.h> */
  51.  
  52. #include "mandel.h"
  53.  
  54. /*---------------------------------*/
  55. #define NOT !
  56. #define FOREVER for(;;)
  57.  
  58. /* === the definitions for the ColorWindow =============================== */
  59. #define COLOR_KNOB_BODY     0x1000  /* 0x1111 */
  60.  
  61. #define COLORWINDOW_WIDTH   208
  62. #define COLORWINDOW_HEIGHT  101     /* 91 */
  63.  
  64. #define DEFAULT_WINDOW_LEFT (320 - COLORWINDOW_WIDTH)
  65. #define DEFAULT_WINDOW_TOP  (200 - COLORWINDOW_HEIGHT)
  66.  
  67. #define CHARACTER_WIDTH     8
  68. #define CHARACTER_HEIGHT    8
  69.  
  70. #define COLOR_BOX_LEFT        7
  71. #define COLOR_BOX_TOP        16        /* 6 */
  72. #define COLOR_BOX_RIGHT     (COLOR_BOX_LEFT + 15)
  73. #define COLOR_BOX_BOTTOM    (COLOR_BOX_TOP + 29)
  74. #define COLOR_COLOR_TOP     55        /* 45 */
  75. #define COLOR_COLOR_WIDTH   15
  76. #define COLOR_COLOR_HEIGHT  10
  77. #define COLOR_PROP_LEFT     38
  78. #define COLOR_PROP_TOP        14        /* 4 */
  79. #define COLOR_PROP_WIDTH    165
  80. #define COLOR_PROP_HEIGHT   10
  81. #define COLOR_CLUSTER_LEFT  141
  82. #define COLOR_CLUSTER_TOP   51        /* 41 */
  83. #define COLOR_CLUSTER_WIDTH (CHARACTER_WIDTH * 6 + 4)
  84. #define COLOR_CLUSTER_HEIGHT    9
  85. #define COLOR_AIN_TOP        (COLOR_BOX_TOP - 2)
  86. #define COLOR_AIN_LEFT        (COLOR_BOX_RIGHT + 3)
  87.  
  88. /* GREEN and RED are out of order.  Do you wonder why?    Some day I'll
  89.  * tell you.  =RJ=
  90.  */
  91. #define COLOR_COPY    MAXCOL
  92. #define COLOR_RANGE    MAXCOL+1
  93. #define COLOR_OK    MAXCOL+2
  94. #define COLOR_CANCEL    MAXCOL+3
  95. #define COLOR_GREEN    MAXCOL+4
  96. #define COLOR_RED    MAXCOL+5
  97. #define COLOR_BLUE    MAXCOL+6
  98. #define COLOR_AIN_RGB    MAXCOL+7
  99. #define COLOR_GADGETS_COUNT MAXCOL+8
  100.  
  101. #define RAIN_MAX_DISTANCE   (MaxColor - 2)
  102. #define RAIN_MIN_DISTANCE   1
  103.  
  104. #define ONE_HALF    (0x8000L)
  105.  
  106. #define SafeFont    Topaz80
  107.  
  108. /****************************************************************************
  109.  *            MAND6.C - Color Window Data
  110.  *           Mandelbrot Self-Squared Dragon Generator
  111.  *              For the Commodore Amiga
  112.  *               Version 2.01
  113.  *
  114.  *           Copyright (C) 1986, =Robert J. Mical=
  115.  *            Placed in the Public Domain
  116.  *
  117.  *  This program may be distributed free of charge as long as the above
  118.  *  notice is retained.  You may extract any or all information contained
  119.  *  in this file for use in your own programs
  120.  *
  121.  ***************************************************************************/
  122.  
  123.  
  124. /****************************************************************************
  125.  *
  126.  * Color window template initialization and routines,
  127.  * for colorwindow and cyclewindow
  128.  *
  129.  * Throughout this file, the COLOR_RED and COLOR_GREEN gadgets are in the
  130.  * opposite order you would expect.
  131.  *
  132.  ***************************************************************************/
  133.  
  134. STATIC USHORT RGBData[] =
  135. {
  136.     0x0000, 0xFC00, 0x6600, 0x6600, 0x7C00, 0x6C00, 0x6600, 0xE300,
  137.     0x0000, 0x0000, 0x0000, 0x0000, 0x3C00, 0x6600, 0xC000, 0xCE00,
  138.     0xC600, 0x6600, 0x3E00, 0x0000, 0x0000, 0x0000, 0x0000, 0xFC00,
  139.     0x6600, 0x6600, 0x7C00, 0x6600, 0x6600, 0xFC00, 0x0000,
  140.     /* The rest is for the Rainbow Image */
  141.     ~0x0000, ~0xFC00, ~0x6600, ~0x6600, ~0x7C00, ~0x6C00, ~0x6600, ~0xE300,
  142.     ~0x0000, ~0x0000, ~0x0000, ~0x0000, ~0x3C00, ~0x6600, ~0xC000, ~0xCE00,
  143.     ~0xC600, ~0x6600, ~0x3E00, ~0x0000, ~0x0000, ~0x0000, ~0x0000, ~0xFC00,
  144.     ~0x6600, ~0x6600, ~0x7C00, ~0x6600, ~0x6600, ~0xFC00, ~0x0000
  145. };
  146.  
  147. #define MID_RGB_AIN (sizeof(RGBData)/sizeof(RGBData[0])/2)
  148.  
  149.  
  150. STATIC struct Image ColorRGBImage =
  151. {
  152.     3, 0,
  153.     8,
  154.     31,
  155.     1,
  156.     &RGBData[0],
  157.     0x1, 0x0,
  158.     NULL,
  159. };
  160.  
  161. STATIC struct Image ColorRAINImage =
  162. {
  163.     3, 0,
  164.     8,
  165.     31,
  166.     1,
  167.     &RGBData[MID_RGB_AIN],
  168.     0x1, 0x0,
  169.     NULL,
  170. };
  171.  
  172. STATIC SHORT ClusterBorderVectors[] =
  173. {
  174.     -1, -1,
  175.     -1, COLOR_CLUSTER_HEIGHT,
  176.     COLOR_CLUSTER_WIDTH, COLOR_CLUSTER_HEIGHT,
  177.     COLOR_CLUSTER_WIDTH, -1,
  178.     -1, -1,
  179. };
  180.  
  181.  
  182. STATIC struct Border ColorClusterBorder =
  183. {
  184.     0, 0,
  185.     1, 0,
  186.     JAM1,
  187.     5,
  188.     &ClusterBorderVectors[0],
  189.     NULL,
  190. };
  191.  
  192. STATIC struct IntuiText ColorClusterText[4] =
  193. {   /* "COPY" */
  194.     {
  195.     1, 0,
  196.     JAM2,
  197.     2 + CHARACTER_WIDTH, 1,
  198.     &SafeFont,
  199.     (UBYTE *) "COPY",
  200.     NULL,
  201.     }, /* "RANGE" */
  202.     {
  203.     1, 0,
  204.     JAM2,
  205.     2 + (CHARACTER_WIDTH >> 1), 1,
  206.     &SafeFont,
  207.     (UBYTE *) "RANGE",
  208.     NULL,
  209.     }, /* "OK" */
  210.     {
  211.     1, 0,
  212.     JAM2,
  213.     2 + (CHARACTER_WIDTH << 1), 1,
  214.     &SafeFont,
  215.     (UBYTE *) "OK",
  216.     NULL,
  217.     }, /* "CANCEL" */
  218.     {
  219.     1, 0,
  220.     JAM2,
  221.     2, 1,
  222.     &SafeFont,
  223.     (UBYTE *) "CANCEL",
  224.     NULL,
  225.     },
  226. };
  227.  
  228. STATIC struct IntuiText LessMoreText =
  229. /* "COPY" "<>" */
  230. {
  231.     1, 0,
  232.     JAM2,
  233.     2 + (CHARACTER_WIDTH >> 1), 1,
  234.     &SafeFont,
  235.     (UBYTE *) " <-> ",
  236.     NULL,
  237. };
  238. STATIC struct IntuiText MoreLessText =
  239. { /* "RANGE" "><" */
  240.     1, 0,
  241.     JAM2,
  242.     2 + (CHARACTER_WIDTH >> 1), 1,
  243.     &SafeFont,
  244.     (UBYTE *) " >-< ",
  245.     NULL,
  246. };
  247.  
  248. /* ======================================================================= */
  249. /* ======================================================================= */
  250. /* ======================================================================= */
  251.  
  252. /* RJM anchor */
  253. STATIC struct Image ColorPropsImages[3];
  254. STATIC struct Image SuperColorImages[MAXCOL];
  255.  
  256.  
  257. STATIC struct PropInfo ColorPropsInfos[3] =
  258. {
  259.     { /* COLOR_GREEN */
  260.     AUTOKNOB | FREEHORIZ,
  261.     0,
  262.     0,
  263.     COLOR_KNOB_BODY,
  264.     0,
  265.     0, 0, 0, 0, 0, 0,
  266.     },
  267.     { /* COLOR_RED */
  268.     AUTOKNOB | FREEHORIZ,
  269.     0,
  270.     0,
  271.     COLOR_KNOB_BODY,
  272.     0,
  273.     0, 0, 0, 0, 0, 0,
  274.     },
  275.     { /* COLOR_BLUE */
  276.     AUTOKNOB | FREEHORIZ,
  277.     0,
  278.     0,
  279.     COLOR_KNOB_BODY,
  280.     0,
  281.     0, 0, 0, 0, 0, 0,
  282.     }
  283. };
  284.  
  285.  
  286. STATIC struct Gadget ColorTemplateGadgets[COLOR_GADGETS_COUNT] =
  287. {
  288.     { /* COLOR_00 */
  289.     NULL,
  290.     COLOR_BOX_LEFT + ((00 & 0x7) * COLOR_COLOR_WIDTH),
  291.     COLOR_COLOR_TOP + ((00 >> 3) * COLOR_COLOR_HEIGHT),
  292.     COLOR_COLOR_WIDTH,
  293.     COLOR_COLOR_HEIGHT,
  294.     GADGIMAGE | GADGHNONE,
  295.     GADGIMMEDIATE,
  296.     BOOLGADGET,
  297.     (APTR)&SuperColorImages[00],
  298.     (APTR)&SuperColorImages[00],
  299.     NULL,
  300.     NULL,
  301.     NULL,
  302.     00,
  303.     NULL,
  304.     },
  305.     { /* COLOR_01 */
  306.     &ColorTemplateGadgets[00],
  307.     COLOR_BOX_LEFT + ((01 & 0x7) * COLOR_COLOR_WIDTH),
  308.     COLOR_COLOR_TOP + ((01 >> 3) * COLOR_COLOR_HEIGHT),
  309.     COLOR_COLOR_WIDTH,
  310.     COLOR_COLOR_HEIGHT,
  311.     GADGIMAGE | GADGHNONE,
  312.     GADGIMMEDIATE,
  313.     BOOLGADGET,
  314.     (APTR)&SuperColorImages[01],
  315.     (APTR)&SuperColorImages[01],
  316.     NULL,
  317.     NULL,
  318.     NULL,
  319.     01,
  320.     NULL,
  321.     },
  322.     { /* COLOR_02 */
  323.     &ColorTemplateGadgets[01],
  324.     COLOR_BOX_LEFT + ((02 & 0x7) * COLOR_COLOR_WIDTH),
  325.     COLOR_COLOR_TOP + ((02 >> 3) * COLOR_COLOR_HEIGHT),
  326.     COLOR_COLOR_WIDTH,
  327.     COLOR_COLOR_HEIGHT,
  328.     GADGIMAGE | GADGHNONE,
  329.     GADGIMMEDIATE,
  330.     BOOLGADGET,
  331.     (APTR)&SuperColorImages[02],
  332.     (APTR)&SuperColorImages[02],
  333.     NULL,
  334.     NULL,
  335.     NULL,
  336.     02,
  337.     NULL,
  338.     },
  339.     { /* COLOR_03 */
  340.     &ColorTemplateGadgets[02],
  341.     COLOR_BOX_LEFT + ((03 & 0x7) * COLOR_COLOR_WIDTH),
  342.     COLOR_COLOR_TOP + ((03 >> 3) * COLOR_COLOR_HEIGHT),
  343.     COLOR_COLOR_WIDTH,
  344.     COLOR_COLOR_HEIGHT,
  345.     GADGIMAGE | GADGHNONE,
  346.     GADGIMMEDIATE,
  347.     BOOLGADGET,
  348.     (APTR)&SuperColorImages[03],
  349.     (APTR)&SuperColorImages[03],
  350.     NULL,
  351.     NULL,
  352.     NULL,
  353.     03,
  354.     NULL,
  355.     },
  356.     { /* COLOR_04 */
  357.     &ColorTemplateGadgets[03],
  358.     COLOR_BOX_LEFT + ((04 & 0x7) * COLOR_COLOR_WIDTH),
  359.     COLOR_COLOR_TOP + ((04 >> 3) * COLOR_COLOR_HEIGHT),
  360.     COLOR_COLOR_WIDTH,
  361.     COLOR_COLOR_HEIGHT,
  362.     GADGIMAGE | GADGHNONE,
  363.     GADGIMMEDIATE,
  364.     BOOLGADGET,
  365.     (APTR)&SuperColorImages[04],
  366.     (APTR)&SuperColorImages[04],
  367.     NULL,
  368.     NULL,
  369.     NULL,
  370.     04,
  371.     NULL,
  372.     },
  373.     { /* COLOR_05 */
  374.     &ColorTemplateGadgets[04],
  375.     COLOR_BOX_LEFT + ((05 & 0x7) * COLOR_COLOR_WIDTH),
  376.     COLOR_COLOR_TOP + ((05 >> 3) * COLOR_COLOR_HEIGHT),
  377.     COLOR_COLOR_WIDTH,
  378.     COLOR_COLOR_HEIGHT,
  379.     GADGIMAGE | GADGHNONE,
  380.     GADGIMMEDIATE,
  381.     BOOLGADGET,
  382.     (APTR)&SuperColorImages[05],
  383.     (APTR)&SuperColorImages[05],
  384.     NULL,
  385.     NULL,
  386.     NULL,
  387.     05,
  388.     NULL,
  389.     },
  390.     { /* COLOR_06 */
  391.     &ColorTemplateGadgets[05],
  392.     COLOR_BOX_LEFT + ((06 & 0x7) * COLOR_COLOR_WIDTH),
  393.     COLOR_COLOR_TOP + ((06 >> 3) * COLOR_COLOR_HEIGHT),
  394.     COLOR_COLOR_WIDTH,
  395.     COLOR_COLOR_HEIGHT,
  396.     GADGIMAGE | GADGHNONE,
  397.     GADGIMMEDIATE,
  398.     BOOLGADGET,
  399.     (APTR)&SuperColorImages[06],
  400.     (APTR)&SuperColorImages[06],
  401.     NULL,
  402.     NULL,
  403.     NULL,
  404.     06,
  405.     NULL,
  406.     },
  407.     { /* COLOR_07 */
  408.     &ColorTemplateGadgets[06],
  409.     COLOR_BOX_LEFT + ((07 & 0x7) * COLOR_COLOR_WIDTH),
  410.     COLOR_COLOR_TOP + ((07 >> 3) * COLOR_COLOR_HEIGHT),
  411.     COLOR_COLOR_WIDTH,
  412.     COLOR_COLOR_HEIGHT,
  413.     GADGIMAGE | GADGHNONE,
  414.     GADGIMMEDIATE,
  415.     BOOLGADGET,
  416.     (APTR)&SuperColorImages[07],
  417.     (APTR)&SuperColorImages[07],
  418.     NULL,
  419.     NULL,
  420.     NULL,
  421.     07,
  422.     NULL,
  423.     },
  424.     { /* COLOR_08 */
  425.     &ColorTemplateGadgets[07],
  426.     COLOR_BOX_LEFT + ((8 & 0x7) * COLOR_COLOR_WIDTH),
  427.     COLOR_COLOR_TOP + ((8 >> 3) * COLOR_COLOR_HEIGHT),
  428.     COLOR_COLOR_WIDTH,
  429.     COLOR_COLOR_HEIGHT,
  430.     GADGIMAGE | GADGHNONE,
  431.     GADGIMMEDIATE,
  432.     BOOLGADGET,
  433.     (APTR)&SuperColorImages[8],
  434.     (APTR)&SuperColorImages[8],
  435.     NULL,
  436.     NULL,
  437.     NULL,
  438.     8,
  439.     NULL,
  440.     },
  441.     { /* COLOR_09 */
  442.     &ColorTemplateGadgets[8],
  443.     COLOR_BOX_LEFT + ((9 & 0x7) * COLOR_COLOR_WIDTH),
  444.     COLOR_COLOR_TOP + ((9 >> 3) * COLOR_COLOR_HEIGHT),
  445.     COLOR_COLOR_WIDTH,
  446.     COLOR_COLOR_HEIGHT,
  447.     GADGIMAGE | GADGHNONE,
  448.     GADGIMMEDIATE,
  449.     BOOLGADGET,
  450.     (APTR)&SuperColorImages[9],
  451.     (APTR)&SuperColorImages[9],
  452.     NULL,
  453.     NULL,
  454.     NULL,
  455.     9,
  456.     NULL,
  457.     },
  458.     { /* COLOR_10 */
  459.     &ColorTemplateGadgets[9],
  460.     COLOR_BOX_LEFT + ((10 & 0x7) * COLOR_COLOR_WIDTH),
  461.     COLOR_COLOR_TOP + ((10 >> 3) * COLOR_COLOR_HEIGHT),
  462.     COLOR_COLOR_WIDTH,
  463.     COLOR_COLOR_HEIGHT,
  464.     GADGIMAGE | GADGHNONE,
  465.     GADGIMMEDIATE,
  466.     BOOLGADGET,
  467.     (APTR)&SuperColorImages[10],
  468.     (APTR)&SuperColorImages[10],
  469.     NULL,
  470.     NULL,
  471.     NULL,
  472.     10,
  473.     NULL,
  474.     },
  475.     { /* COLOR_11 */
  476.     &ColorTemplateGadgets[10],
  477.     COLOR_BOX_LEFT + ((11 & 0x7) * COLOR_COLOR_WIDTH),
  478.     COLOR_COLOR_TOP + ((11 >> 3) * COLOR_COLOR_HEIGHT),
  479.     COLOR_COLOR_WIDTH,
  480.     COLOR_COLOR_HEIGHT,
  481.     GADGIMAGE | GADGHNONE,
  482.     GADGIMMEDIATE,
  483.     BOOLGADGET,
  484.     (APTR)&SuperColorImages[11],
  485.     (APTR)&SuperColorImages[11],
  486.     NULL,
  487.     NULL,
  488.     NULL,
  489.     11,
  490.     NULL,
  491.     },
  492.     { /* COLOR_12 */
  493.     &ColorTemplateGadgets[11],
  494.     COLOR_BOX_LEFT + ((12 & 0x7) * COLOR_COLOR_WIDTH),
  495.     COLOR_COLOR_TOP + ((12 >> 3) * COLOR_COLOR_HEIGHT),
  496.     COLOR_COLOR_WIDTH,
  497.     COLOR_COLOR_HEIGHT,
  498.     GADGIMAGE | GADGHNONE,
  499.     GADGIMMEDIATE,
  500.     BOOLGADGET,
  501.     (APTR)&SuperColorImages[12],
  502.     (APTR)&SuperColorImages[12],
  503.     NULL,
  504.     NULL,
  505.     NULL,
  506.     12,
  507.     NULL,
  508.     },
  509.     { /* COLOR_13 */
  510.     &ColorTemplateGadgets[12],
  511.     COLOR_BOX_LEFT + ((13 & 0x7) * COLOR_COLOR_WIDTH),
  512.     COLOR_COLOR_TOP + ((13 >> 3) * COLOR_COLOR_HEIGHT),
  513.     COLOR_COLOR_WIDTH,
  514.     COLOR_COLOR_HEIGHT,
  515.     GADGIMAGE | GADGHNONE,
  516.     GADGIMMEDIATE,
  517.     BOOLGADGET,
  518.     (APTR)&SuperColorImages[13],
  519.     (APTR)&SuperColorImages[13],
  520.     NULL,
  521.     NULL,
  522.     NULL,
  523.     13,
  524.     NULL,
  525.     },
  526.     { /* COLOR_14 */
  527.     &ColorTemplateGadgets[13],
  528.     COLOR_BOX_LEFT + ((14 & 0x7) * COLOR_COLOR_WIDTH),
  529.     COLOR_COLOR_TOP + ((14 >> 3) * COLOR_COLOR_HEIGHT),
  530.     COLOR_COLOR_WIDTH,
  531.     COLOR_COLOR_HEIGHT,
  532.     GADGIMAGE | GADGHNONE,
  533.     GADGIMMEDIATE,
  534.     BOOLGADGET,
  535.     (APTR)&SuperColorImages[14],
  536.     (APTR)&SuperColorImages[14],
  537.     NULL,
  538.     NULL,
  539.     NULL,
  540.     14,
  541.     NULL,
  542.     },
  543.     { /* COLOR_15 */
  544.     &ColorTemplateGadgets[14],
  545.     COLOR_BOX_LEFT + ((15 & 0x7) * COLOR_COLOR_WIDTH),
  546.     COLOR_COLOR_TOP + ((15 >> 3) * COLOR_COLOR_HEIGHT),
  547.     COLOR_COLOR_WIDTH,
  548.     COLOR_COLOR_HEIGHT,
  549.     GADGIMAGE | GADGHNONE,
  550.     GADGIMMEDIATE,
  551.     BOOLGADGET,
  552.     (APTR)&SuperColorImages[15],
  553.     (APTR)&SuperColorImages[15],
  554.     NULL,
  555.     NULL,
  556.     NULL,
  557.     15,
  558.     NULL,
  559.     },
  560.     { /* COLOR_16 */
  561.     &ColorTemplateGadgets[15],
  562.     COLOR_BOX_LEFT + ((16 & 0x7) * COLOR_COLOR_WIDTH),
  563.     COLOR_COLOR_TOP + ((16 >> 3) * COLOR_COLOR_HEIGHT),
  564.     COLOR_COLOR_WIDTH,
  565.     COLOR_COLOR_HEIGHT,
  566.     GADGIMAGE | GADGHNONE,
  567.     GADGIMMEDIATE,
  568.     BOOLGADGET,
  569.     (APTR)&SuperColorImages[16],
  570.     (APTR)&SuperColorImages[16],
  571.     NULL,
  572.     NULL,
  573.     NULL,
  574.     16,
  575.     NULL,
  576.     },
  577.     { /* COLOR_17 */
  578.     &ColorTemplateGadgets[16],
  579.     COLOR_BOX_LEFT + ((17 & 0x7) * COLOR_COLOR_WIDTH),
  580.     COLOR_COLOR_TOP + ((17 >> 3) * COLOR_COLOR_HEIGHT),
  581.     COLOR_COLOR_WIDTH,
  582.     COLOR_COLOR_HEIGHT,
  583.     GADGIMAGE | GADGHNONE,
  584.     GADGIMMEDIATE,
  585.     BOOLGADGET,
  586.     (APTR)&SuperColorImages[17],
  587.     (APTR)&SuperColorImages[17],
  588.     NULL,
  589.     NULL,
  590.     NULL,
  591.     17,
  592.     NULL,
  593.     },
  594.     { /* COLOR_18 */
  595.     &ColorTemplateGadgets[17],
  596.     COLOR_BOX_LEFT + ((18 & 0x7) * COLOR_COLOR_WIDTH),
  597.     COLOR_COLOR_TOP + ((18 >> 3) * COLOR_COLOR_HEIGHT),
  598.     COLOR_COLOR_WIDTH,
  599.     COLOR_COLOR_HEIGHT,
  600.     GADGIMAGE | GADGHNONE,
  601.     GADGIMMEDIATE,
  602.     BOOLGADGET,
  603.     (APTR)&SuperColorImages[18],
  604.     (APTR)&SuperColorImages[18],
  605.     NULL,
  606.     NULL,
  607.     NULL,
  608.     18,
  609.     NULL,
  610.     },
  611.     { /* COLOR_19 */
  612.     &ColorTemplateGadgets[18],
  613.     COLOR_BOX_LEFT + ((19 & 0x7) * COLOR_COLOR_WIDTH),
  614.     COLOR_COLOR_TOP + ((19 >> 3) * COLOR_COLOR_HEIGHT),
  615.     COLOR_COLOR_WIDTH,
  616.     COLOR_COLOR_HEIGHT,
  617.     GADGIMAGE | GADGHNONE,
  618.     GADGIMMEDIATE,
  619.     BOOLGADGET,
  620.     (APTR)&SuperColorImages[19],
  621.     (APTR)&SuperColorImages[19],
  622.     NULL,
  623.     NULL,
  624.     NULL,
  625.     19,
  626.     NULL,
  627.     },
  628.     { /* COLOR_20 */
  629.     &ColorTemplateGadgets[19],
  630.     COLOR_BOX_LEFT + ((20 & 0x7) * COLOR_COLOR_WIDTH),
  631.     COLOR_COLOR_TOP + ((20 >> 3) * COLOR_COLOR_HEIGHT),
  632.     COLOR_COLOR_WIDTH,
  633.     COLOR_COLOR_HEIGHT,
  634.     GADGIMAGE | GADGHNONE,
  635.     GADGIMMEDIATE,
  636.     BOOLGADGET,
  637.     (APTR)&SuperColorImages[20],
  638.     (APTR)&SuperColorImages[20],
  639.     NULL,
  640.     NULL,
  641.     NULL,
  642.     20,
  643.     NULL,
  644.     },
  645.     { /* COLOR_21 */
  646.     &ColorTemplateGadgets[20],
  647.     COLOR_BOX_LEFT + ((21 & 0x7) * COLOR_COLOR_WIDTH),
  648.     COLOR_COLOR_TOP + ((21 >> 3) * COLOR_COLOR_HEIGHT),
  649.     COLOR_COLOR_WIDTH,
  650.     COLOR_COLOR_HEIGHT,
  651.     GADGIMAGE | GADGHNONE,
  652.     GADGIMMEDIATE,
  653.     BOOLGADGET,
  654.     (APTR)&SuperColorImages[21],
  655.     (APTR)&SuperColorImages[21],
  656.     NULL,
  657.     NULL,
  658.     NULL,
  659.     21,
  660.     NULL,
  661.     },
  662.     { /* COLOR_22 */
  663.     &ColorTemplateGadgets[21],
  664.     COLOR_BOX_LEFT + ((22 & 0x7) * COLOR_COLOR_WIDTH),
  665.     COLOR_COLOR_TOP + ((22 >> 3) * COLOR_COLOR_HEIGHT),
  666.     COLOR_COLOR_WIDTH,
  667.     COLOR_COLOR_HEIGHT,
  668.     GADGIMAGE | GADGHNONE,
  669.     GADGIMMEDIATE,
  670.     BOOLGADGET,
  671.     (APTR)&SuperColorImages[22],
  672.     (APTR)&SuperColorImages[22],
  673.     NULL,
  674.     NULL,
  675.     NULL,
  676.     22,
  677.     NULL,
  678.     },
  679.     { /* COLOR_23 */
  680.     &ColorTemplateGadgets[22],
  681.     COLOR_BOX_LEFT + ((23 & 0x7) * COLOR_COLOR_WIDTH),
  682.     COLOR_COLOR_TOP + ((23 >> 3) * COLOR_COLOR_HEIGHT),
  683.     COLOR_COLOR_WIDTH,
  684.     COLOR_COLOR_HEIGHT,
  685.     GADGIMAGE | GADGHNONE,
  686.     GADGIMMEDIATE,
  687.     BOOLGADGET,
  688.     (APTR)&SuperColorImages[23],
  689.     (APTR)&SuperColorImages[23],
  690.     NULL,
  691.     NULL,
  692.     NULL,
  693.     23,
  694.     NULL,
  695.     },
  696.     { /* COLOR_24 */
  697.     &ColorTemplateGadgets[23],
  698.     COLOR_BOX_LEFT + ((24 & 0x7) * COLOR_COLOR_WIDTH),
  699.     COLOR_COLOR_TOP + ((24 >> 3) * COLOR_COLOR_HEIGHT),
  700.     COLOR_COLOR_WIDTH,
  701.     COLOR_COLOR_HEIGHT,
  702.     GADGIMAGE | GADGHNONE,
  703.     GADGIMMEDIATE,
  704.     BOOLGADGET,
  705.     (APTR)&SuperColorImages[24],
  706.     (APTR)&SuperColorImages[24],
  707.     NULL,
  708.     NULL,
  709.     NULL,
  710.     24,
  711.     NULL,
  712.     },
  713.     { /* COLOR_25 */
  714.     &ColorTemplateGadgets[24],
  715.     COLOR_BOX_LEFT + ((25 & 0x7) * COLOR_COLOR_WIDTH),
  716.     COLOR_COLOR_TOP + ((25 >> 3) * COLOR_COLOR_HEIGHT),
  717.     COLOR_COLOR_WIDTH,
  718.     COLOR_COLOR_HEIGHT,
  719.     GADGIMAGE | GADGHNONE,
  720.     GADGIMMEDIATE,
  721.     BOOLGADGET,
  722.     (APTR)&SuperColorImages[25],
  723.     (APTR)&SuperColorImages[25],
  724.     NULL,
  725.     NULL,
  726.     NULL,
  727.     25,
  728.     NULL,
  729.     },
  730.     { /* COLOR_26 */
  731.     &ColorTemplateGadgets[25],
  732.     COLOR_BOX_LEFT + ((26 & 0x7) * COLOR_COLOR_WIDTH),
  733.     COLOR_COLOR_TOP + ((26 >> 3) * COLOR_COLOR_HEIGHT),
  734.     COLOR_COLOR_WIDTH,
  735.     COLOR_COLOR_HEIGHT,
  736.     GADGIMAGE | GADGHNONE,
  737.     GADGIMMEDIATE,
  738.     BOOLGADGET,
  739.     (APTR)&SuperColorImages[26],
  740.     (APTR)&SuperColorImages[26],
  741.     NULL,
  742.     NULL,
  743.     NULL,
  744.     26,
  745.     NULL,
  746.     },
  747.     { /* COLOR_27 */
  748.     &ColorTemplateGadgets[26],
  749.     COLOR_BOX_LEFT + ((27 & 0x7) * COLOR_COLOR_WIDTH),
  750.     COLOR_COLOR_TOP + ((27 >> 3) * COLOR_COLOR_HEIGHT),
  751.     COLOR_COLOR_WIDTH,
  752.     COLOR_COLOR_HEIGHT,
  753.     GADGIMAGE | GADGHNONE,
  754.     GADGIMMEDIATE,
  755.     BOOLGADGET,
  756.     (APTR)&SuperColorImages[27],
  757.     (APTR)&SuperColorImages[27],
  758.     NULL,
  759.     NULL,
  760.     NULL,
  761.     27,
  762.     NULL,
  763.     },
  764.     { /* COLOR_28 */
  765.     &ColorTemplateGadgets[27],
  766.     COLOR_BOX_LEFT + ((28 & 0x7) * COLOR_COLOR_WIDTH),
  767.     COLOR_COLOR_TOP + ((28 >> 3) * COLOR_COLOR_HEIGHT),
  768.     COLOR_COLOR_WIDTH,
  769.     COLOR_COLOR_HEIGHT,
  770.     GADGIMAGE | GADGHNONE,
  771.     GADGIMMEDIATE,
  772.     BOOLGADGET,
  773.     (APTR)&SuperColorImages[28],
  774.     (APTR)&SuperColorImages[28],
  775.     NULL,
  776.     NULL,
  777.     NULL,
  778.     28,
  779.     NULL,
  780.     },
  781.     { /* COLOR_29 */
  782.     &ColorTemplateGadgets[28],
  783.     COLOR_BOX_LEFT + ((29 & 0x7) * COLOR_COLOR_WIDTH),
  784.     COLOR_COLOR_TOP + ((29 >> 3) * COLOR_COLOR_HEIGHT),
  785.     COLOR_COLOR_WIDTH,
  786.     COLOR_COLOR_HEIGHT,
  787.     GADGIMAGE | GADGHNONE,
  788.     GADGIMMEDIATE,
  789.     BOOLGADGET,
  790.     (APTR)&SuperColorImages[29],
  791.     (APTR)&SuperColorImages[29],
  792.     NULL,
  793.     NULL,
  794.     NULL,
  795.     29,
  796.     NULL,
  797.     },
  798.     { /* COLOR_30 */
  799.     &ColorTemplateGadgets[29],
  800.     COLOR_BOX_LEFT + ((30 & 0x7) * COLOR_COLOR_WIDTH),
  801.     COLOR_COLOR_TOP + ((30 >> 3) * COLOR_COLOR_HEIGHT),
  802.     COLOR_COLOR_WIDTH,
  803.     COLOR_COLOR_HEIGHT,
  804.     GADGIMAGE | GADGHNONE,
  805.     GADGIMMEDIATE,
  806.     BOOLGADGET,
  807.     (APTR)&SuperColorImages[30],
  808.     (APTR)&SuperColorImages[30],
  809.     NULL,
  810.     NULL,
  811.     NULL,
  812.     30,
  813.     NULL,
  814.     },
  815.     { /* COLOR_31 */
  816.     &ColorTemplateGadgets[30],
  817.     COLOR_BOX_LEFT + ((31 & 0x7) * COLOR_COLOR_WIDTH),
  818.     COLOR_COLOR_TOP + ((31 >> 3) * COLOR_COLOR_HEIGHT),
  819.     COLOR_COLOR_WIDTH,
  820.     COLOR_COLOR_HEIGHT,
  821.     GADGIMAGE | GADGHNONE,
  822.     GADGIMMEDIATE,
  823.     BOOLGADGET,
  824.     (APTR)&SuperColorImages[31],
  825.     (APTR)&SuperColorImages[31],
  826.     NULL,
  827.     NULL,
  828.     NULL,
  829.     31,
  830.     NULL,
  831.     },
  832.     { /* COLOR_COPY */
  833.     &ColorTemplateGadgets[31],
  834.     COLOR_CLUSTER_LEFT,
  835.     COLOR_CLUSTER_TOP + (00 * (COLOR_CLUSTER_HEIGHT + 3)),
  836.     COLOR_CLUSTER_WIDTH,
  837.     COLOR_CLUSTER_HEIGHT,
  838.     GADGHCOMP,
  839.     RELVERIFY,
  840.     BOOLGADGET,
  841.     (APTR)&ColorClusterBorder,
  842.     NULL,
  843.     &ColorClusterText[00],
  844.     NULL,
  845.     NULL,
  846.     COLOR_COPY,
  847.     NULL,
  848.     },
  849.     { /* COLOR_RANGE */
  850.     &ColorTemplateGadgets[COLOR_COPY],
  851.     COLOR_CLUSTER_LEFT,
  852.     COLOR_CLUSTER_TOP + (01 * (COLOR_CLUSTER_HEIGHT + 3)),
  853.     COLOR_CLUSTER_WIDTH,
  854.     COLOR_CLUSTER_HEIGHT,
  855.     GADGHCOMP,
  856.     RELVERIFY,
  857.     BOOLGADGET,
  858.     (APTR)&ColorClusterBorder,
  859.     NULL,
  860.     &ColorClusterText[01],
  861.     NULL,
  862.     NULL,
  863.     COLOR_RANGE,
  864.     NULL,
  865.     },
  866.     { /* COLOR_OK */
  867.     &ColorTemplateGadgets[COLOR_RANGE],
  868.     COLOR_CLUSTER_LEFT,
  869.     COLOR_CLUSTER_TOP + (02 * (COLOR_CLUSTER_HEIGHT + 3)),
  870.     COLOR_CLUSTER_WIDTH,
  871.     COLOR_CLUSTER_HEIGHT,
  872.     GADGHCOMP,
  873.     RELVERIFY,
  874.     BOOLGADGET,
  875.     (APTR)&ColorClusterBorder,
  876.     NULL,
  877.     &ColorClusterText[02],
  878.     NULL,
  879.     NULL,
  880.     COLOR_OK,
  881.     NULL,
  882.     },
  883.     { /* COLOR_CANCEL */
  884.     &ColorTemplateGadgets[COLOR_OK],
  885.     COLOR_CLUSTER_LEFT,
  886.     COLOR_CLUSTER_TOP + (03 * (COLOR_CLUSTER_HEIGHT + 3)),
  887.     COLOR_CLUSTER_WIDTH,
  888.     COLOR_CLUSTER_HEIGHT,
  889.     GADGHCOMP,
  890.     RELVERIFY,
  891.     BOOLGADGET,
  892.     (APTR)&ColorClusterBorder,
  893.     NULL,
  894.     &ColorClusterText[03],
  895.     NULL,
  896.     NULL,
  897.     COLOR_CANCEL,
  898.     NULL,
  899.     },
  900.     { /* COLOR_GREEN */
  901.     &ColorTemplateGadgets[COLOR_CANCEL],
  902.     COLOR_PROP_LEFT,
  903.     COLOR_PROP_TOP + (01 * (COLOR_PROP_HEIGHT + 1)),
  904.     COLOR_PROP_WIDTH,
  905.     COLOR_PROP_HEIGHT,
  906.     GADGIMAGE | GADGHNONE,    /* GADGHNONE doesn't seem to work! */
  907.     FOLLOWMOUSE,        /* The knob still reverses when selected */
  908.     PROPGADGET,        /* even if I GADGHIMAGE with 2 of the */
  909.     (APTR)&ColorPropsImages[01],    /* same ColorPropsImages */
  910.     NULL,
  911.     NULL,
  912.     NULL,
  913.     (APTR)&ColorPropsInfos[01],
  914.     COLOR_GREEN,
  915.     NULL,
  916.     },
  917.     { /* COLOR_RED */
  918.     &ColorTemplateGadgets[COLOR_GREEN],
  919.     COLOR_PROP_LEFT,
  920.     COLOR_PROP_TOP + (00 * (COLOR_PROP_HEIGHT + 1)),
  921.     COLOR_PROP_WIDTH,
  922.     COLOR_PROP_HEIGHT,
  923.     GADGIMAGE | GADGHNONE,
  924.     FOLLOWMOUSE,
  925.     PROPGADGET,
  926.     (APTR)&ColorPropsImages[00],
  927.     NULL,
  928.     NULL,
  929.     NULL,
  930.     (APTR)&ColorPropsInfos[00],
  931.     COLOR_RED,
  932.     NULL,
  933.     },
  934.     { /* COLOR_BLUE */
  935.     &ColorTemplateGadgets[COLOR_RED],
  936.     COLOR_PROP_LEFT,
  937.     COLOR_PROP_TOP + (02 * (COLOR_PROP_HEIGHT + 1)),
  938.     COLOR_PROP_WIDTH,
  939.     COLOR_PROP_HEIGHT,
  940.     GADGIMAGE | GADGHNONE,
  941.     FOLLOWMOUSE,
  942.     PROPGADGET,
  943.     (APTR)&ColorPropsImages[02],
  944.     NULL,
  945.     NULL,
  946.     NULL,
  947.     (APTR)&ColorPropsInfos[02],
  948.     COLOR_BLUE,
  949.     NULL,
  950.     },
  951.     { /* COLOR_AIN_RGB */
  952.     &ColorTemplateGadgets[COLOR_BLUE],
  953.     COLOR_AIN_LEFT,
  954.     COLOR_AIN_TOP,
  955.     CHARACTER_WIDTH + 5,
  956.     COLOR_BOX_BOTTOM - COLOR_BOX_TOP + 1,
  957.     GADGHIMAGE | GADGIMAGE /*| SELECTED*/,
  958.     TOGGLESELECT | RELVERIFY,
  959.     BOOLGADGET,
  960.     (APTR)&ColorRGBImage,
  961.     (APTR)&ColorRAINImage,
  962.     NULL,
  963.     NULL,
  964.     NULL,
  965.     COLOR_AIN_RGB,
  966.     NULL,
  967.     }
  968. };
  969.  
  970.  
  971.  
  972. /****************************************************************************
  973.  *               MAND5.C - Color Window
  974.  *           Mandelbrot Self-Squared Dragon Generator
  975.  *              For the Commodore Amiga
  976.  *               Version 2.01
  977.  *
  978.  *           Copyright (C) 1986, =Robert J. Mical=
  979.  *            Placed in the Public Domain
  980.  *
  981.  *  This program may be distributed free of charge as long as the above
  982.  *  notice is retained.  You may extract any or all information contained
  983.  *  in this file for use in your own programs
  984.  *
  985.  ***************************************************************************/
  986.  
  987.  
  988. /****************************************************************************
  989.  *
  990.  * Color initialization and routines
  991.  *
  992.  ***************************************************************************/
  993.  
  994. #define COPYCOLOR    1
  995. #define RANGE_FIRST  2
  996. #define RANGE_SECOND 3
  997. STATIC USHORT ColorMode;
  998.  
  999. STATIC USHORT SavePalette[MAXCOL];
  1000.  
  1001. #define COLOR_IDCMP_FLAGS (GADGETDOWN | GADGETUP | MOUSEMOVE)
  1002.  
  1003. #define MIN(x,y)    (x<y ? x : y)
  1004.  
  1005.  
  1006. STATIC struct NewWindow ColorNewWindow =
  1007. {
  1008. /*  SHORT LeftEdge, TopEdge;        /* screen dimensions of window */
  1009. /*  SHORT Width, Height;        /* screen dimensions of window */
  1010.     DEFAULT_WINDOW_LEFT, DEFAULT_WINDOW_TOP,
  1011.     COLORWINDOW_WIDTH, COLORWINDOW_HEIGHT,
  1012.  
  1013. /*  UBYTE DetailPen, BlockPen;        /* for bar/border/gadget rendering */
  1014.     -1, -1,
  1015.  
  1016. /*  ULONG IDCMPFlags;            /* User-selected IDCMP flags */
  1017.     NULL,
  1018.  
  1019. /*  ULONG Flags;            /* see Window struct for defines */
  1020.     SMART_REFRESH | NOCAREREFRESH | WINDOWDRAG | WINDOWDEPTH | ACTIVATE,
  1021.  
  1022. /*  struct Gadget *FirstGadget;*/
  1023.     NULL,
  1024.  
  1025. /*  struct Image *CheckMark;*/
  1026.     NULL,
  1027.  
  1028. /*  UBYTE *Title;            /* the title text for this window */
  1029.     (UBYTE *)"Palette \xE0 la =RJ=",    /* a` \340 */
  1030.  
  1031. /*  struct Screen *Screen;*/
  1032.     NULL,
  1033.  
  1034. /*  struct BitMap *BitMap;*/
  1035.     NULL,
  1036.  
  1037. /*  SHORT MinWidth, MinHeight;        /* minimums */
  1038.     0, 0,
  1039. /*  SHORT MaxWidth, MaxHeight;        /* maximums */
  1040.     0, 0,
  1041.  
  1042. /*  USHORT Type;*/
  1043.     CUSTOMSCREEN,
  1044. };
  1045.  
  1046. STATIC SHORT CurrentColor;
  1047. STATIC SHORT RangeFirst;   /* the first selection of the range-color pair */
  1048. STATIC SHORT MaxColor;
  1049. STATIC BOOL  RainbowMode = FALSE;
  1050. SHORT RainbowDistance = 0;
  1051. SHORT RainbowRMax = 1000;
  1052. SHORT RainbowGMax = 1000;
  1053. SHORT RainbowBMax = 1000;
  1054. SHORT RRMax = -1, RGMax = -1, RBMax = -1;
  1055.  
  1056.  
  1057. struct Window *ColorWindow = NULL;
  1058. STATIC struct ViewPort *vp;
  1059.  
  1060. /* ======================================================================= */
  1061. /* ======================================================================= */
  1062. /* ======================================================================= */
  1063.  
  1064. BOOL OpenColorWindow(w)
  1065. register struct Window *w;
  1066. {
  1067.     register LONG i;
  1068.     extern LONG TypeOfMem();
  1069.  
  1070.     vp = &w->WScreen->ViewPort;
  1071.     ColorMode = NULL;
  1072.  
  1073.     if (ColorWindow) {
  1074.     WindowToFront(ColorWindow);
  1075.     return TRUE;
  1076.     }
  1077.  
  1078.     MaxColor = (1 << w->WScreen->BitMap.Depth) - 1;
  1079.     if (MaxColor > MAXCOL-1) MaxColor = MAXCOL-1;
  1080.     for (i = 0; i < MAXCOL; i++) SavePalette[i] = GetRGB4(vp->ColorMap, i);
  1081.  
  1082.     /* In case we have uninitialised or dumb values */
  1083.     if (RainbowDistance < RAIN_MIN_DISTANCE ||
  1084.     RainbowDistance > RAIN_MAX_DISTANCE) {
  1085.     RainbowDistance = 1 + MaxColor / 3;
  1086.     goto defaults;
  1087.     }
  1088.     if (RainbowRMax > MaxColor ||
  1089.     RainbowGMax > MaxColor ||
  1090.     RainbowBMax > MaxColor) {
  1091. defaults:
  1092.     RainbowRMax = 0;
  1093.     RainbowGMax = (MaxColor+2) / 3;
  1094.     RainbowBMax = 2 * (MaxColor+2) / 3;
  1095.     }
  1096.  
  1097.     ColorTemplateGadgets[COLOR_AIN_RGB].Flags &= ~SELECTED;
  1098.     RainbowMode = FALSE;
  1099.     ColorTemplateGadgets[COLOR_COPY].GadgetText = &ColorClusterText[0];
  1100.     ColorTemplateGadgets[COLOR_RANGE].GadgetText = &ColorClusterText[1];
  1101.  
  1102.     /* Make sure the image data is in CHIP memory */
  1103.     if (TypeOfMem(&RGBData[61]) & MEMF_CHIP) {
  1104.     ColorRGBImage.ImageData = &RGBData[0];
  1105.     ColorRAINImage.ImageData = &RGBData[MID_RGB_AIN];
  1106.     } else {
  1107. #ifdef DEBUG2
  1108.     fprintf(stderr, "Allocate CHIP memory (%d bytes) for RGBData\n",
  1109.         sizeof(RGBData));
  1110. #endif
  1111.     if ((ColorRGBImage.ImageData = AllocMem((ULONG)sizeof(RGBData), MEMF_CHIP))
  1112.         == NULL) return FALSE;
  1113.     ColorRAINImage.ImageData = ColorRGBImage.ImageData + MID_RGB_AIN;
  1114.     /* Copy the data */
  1115.     for (i=0; i< sizeof(RGBData)/sizeof(RGBData[0]); i++)
  1116.         ColorRGBImage.ImageData[i] = RGBData[i];
  1117.     }
  1118.  
  1119.     ColorNewWindow.Screen = w->WScreen;
  1120.     ColorNewWindow.Type = w->WScreen->Flags & SCREENTYPE;
  1121.     ColorNewWindow.IDCMPFlags = NULL;
  1122.     ColorNewWindow.FirstGadget
  1123.     = &ColorTemplateGadgets[COLOR_GADGETS_COUNT - 1];
  1124.     ColorTemplateGadgets[COLOR_COPY].NextGadget =
  1125.     &ColorTemplateGadgets[MaxColor];
  1126.  
  1127.     if (ColorNewWindow.LeftEdge+ColorNewWindow.Width > w->WScreen->Width) {
  1128.     ColorNewWindow.LeftEdge = (w->WScreen->Width-ColorNewWindow.Width) / 2;
  1129.     }
  1130.     if (ColorNewWindow.TopEdge+ColorNewWindow.Height > w->WScreen->Height) {
  1131.     ColorNewWindow.TopEdge = (w->WScreen->Height-ColorNewWindow.Height) / 2;
  1132.     }
  1133.     CurrentColor = 0;
  1134.     SetColorProps();
  1135.     InitSuperColors();
  1136.  
  1137.     if ((ColorWindow = (struct Window *)OpenWindow(&ColorNewWindow)) == NULL) {
  1138.     /* fputs("no memory!\n", console); */
  1139.     return FALSE;
  1140.     }
  1141.     ColorWindow->UserPort = w->UserPort;
  1142.     ModifyIDCMP(ColorWindow, COLOR_IDCMP_FLAGS);
  1143.  
  1144.     DrawColorWindow();
  1145.  
  1146.     return TRUE;
  1147. }
  1148.  
  1149.  
  1150. VOID CloseColorWindow(accept)
  1151. BOOL accept;
  1152. {
  1153.     /* register LONG i; */
  1154.  
  1155.     if (ColorWindow == NULL) return;
  1156.  
  1157.     /* ClearMenuStrip(ColorWindow); */
  1158.     ColorNewWindow.LeftEdge = ColorWindow->LeftEdge;
  1159.     ColorNewWindow.TopEdge = ColorWindow->TopEdge;
  1160.  
  1161.     /* ColorWindow->UserPort = NULL; */
  1162.     /* CloseWindow(ColorWindow); */
  1163.     CloseWindowSafely(ColorWindow);
  1164.     ColorWindow = NULL;
  1165.  
  1166.     /* Return the allocated CHIP memory */
  1167.     if (ColorRGBImage.ImageData != &RGBData) {
  1168. #ifdef DEBUG2
  1169.     fprintf(stderr,"Freeing CHIP mem of RGBData\n");
  1170. #endif
  1171.     FreeMem(ColorRGBImage.ImageData, (ULONG)sizeof(RGBData));
  1172.     }
  1173.  
  1174.     if (NOT accept) LoadRGB4(vp, &SavePalette[0], MaxColor + 1L);
  1175. }
  1176.  
  1177.  
  1178. STATIC VOID ColorRange(first, last)
  1179. SHORT first, last;
  1180. {
  1181.     USHORT i;
  1182.     LONG whole, redfraction, greenfraction, bluefraction;
  1183.     USHORT rgb;
  1184.     SHORT firstred, firstgreen, firstblue;
  1185.     SHORT lastred, lastgreen, lastblue;
  1186.     SHORT workred, workgreen, workblue;
  1187.  
  1188.     if (first > last) {
  1189.     i = first;
  1190.     first = last;
  1191.     last = i;
  1192.     }
  1193.  
  1194.     /* I need to see a spread of at least two, where there's at least one
  1195.      * spot between the endpoints, else there's no work to do so I
  1196.      * might as well just return now.
  1197.      */
  1198.     if (first >= last - 1) return;
  1199.  
  1200.     rgb = GetRGB4(vp->ColorMap, (ULONG) first);
  1201.     firstred = (rgb >> 8) & 0xF;
  1202.     firstgreen = (rgb >> 4) & 0xF;
  1203.     firstblue = (rgb >> 0) & 0xF;
  1204.  
  1205.     rgb = GetRGB4(vp->ColorMap, (ULONG) last);
  1206.     lastred = (rgb >> 8) & 0xF;
  1207.     lastgreen = (rgb >> 4) & 0xF;
  1208.     lastblue = (rgb >> 0) & 0xF;
  1209.  
  1210.     whole = ((LONG) lastred - firstred) << 16;
  1211.     redfraction = whole / (last - first);
  1212.     whole = ((LONG) lastgreen - firstgreen) << 16;
  1213.     greenfraction = whole / (last - first);
  1214.     whole = ((LONG) lastblue - firstblue) << 16;
  1215.     bluefraction = whole / (last - first);
  1216.  
  1217.     for (i = first + 1; i < last; i++) {
  1218.     lastred = (redfraction * (i - first) + ONE_HALF) >> 16;
  1219.     workred = firstred + lastred;
  1220.     lastgreen = (greenfraction * (i - first) + ONE_HALF) >> 16;
  1221.     workgreen = firstgreen + lastgreen;
  1222.     lastblue = (bluefraction * (i - first) + ONE_HALF) >> 16;
  1223.     workblue = firstblue + lastblue;
  1224.     SetRGB4(vp, (ULONG) i, (ULONG) workred, (ULONG) workgreen,
  1225.         (ULONG) workblue);
  1226.     }
  1227. }
  1228.  
  1229.  
  1230. STATIC BOOL ColorGadgetGotten(gadget)
  1231. struct Gadget *gadget;
  1232. {
  1233.     ULONG rgb, pen;
  1234.     struct RastPort *RPort;
  1235.     SHORT green, red, blue;
  1236.  
  1237.     RPort = ColorWindow->RPort;
  1238.  
  1239.     /* Have we got a color specifier? */
  1240.     if (NOT RainbowMode && gadget->GadgetID <= MaxColor) {
  1241.     /* Yes, it's a color gadget.  Set this pen number */
  1242.     pen = gadget->GadgetID;
  1243.     /* First, were we in COPY COLOR mode? */
  1244.     if (ColorMode == COPYCOLOR) {
  1245.         /* Ok, copy old color here first! */
  1246.         rgb = GetRGB4(vp->ColorMap, (ULONG) CurrentColor);
  1247.         SetRGB4(vp, pen, rgb >> 8, rgb >> 4, rgb);
  1248.         ColorMode = NULL;
  1249.     }
  1250.     else if (ColorMode == RANGE_FIRST) {
  1251.         ColorMode = RANGE_SECOND;
  1252.         RangeFirst = pen;
  1253.     }
  1254.     else if (ColorMode == RANGE_SECOND) {
  1255.         ColorMode = NULL;
  1256.         ColorRange(RangeFirst, (SHORT) pen);
  1257.     }
  1258.     CurrentColor = pen;
  1259.     ColorRectFill(RPort, (SHORT) pen);
  1260.  
  1261.     red = RemoveGadget(ColorWindow, &ColorTemplateGadgets[COLOR_RED]);
  1262.     green = RemoveGadget(ColorWindow,&ColorTemplateGadgets[COLOR_GREEN]);
  1263.     blue = RemoveGadget(ColorWindow, &ColorTemplateGadgets[COLOR_BLUE]);
  1264.     SetColorProps();
  1265.     AddGadget(ColorWindow, &ColorTemplateGadgets[COLOR_BLUE],
  1266.         (LONG) blue);
  1267.     AddGadget(ColorWindow, &ColorTemplateGadgets[COLOR_GREEN],
  1268.         (LONG) green);
  1269.     AddGadget(ColorWindow, &ColorTemplateGadgets[COLOR_RED],
  1270.         (LONG) red);
  1271.     RefreshGadgets(&ColorTemplateGadgets[COLOR_GADGETS_COUNT - 1],
  1272.         ColorWindow);
  1273.     }
  1274.  
  1275.     else if (RainbowMode && gadget->GadgetID <= MaxColor) {
  1276.     /* Yes, it's a color gadget.  Get its old color back. */
  1277.     pen = gadget->GadgetID;
  1278.     red   = (SavePalette[pen] & 0xF00) >> 8;
  1279.     green = (SavePalette[pen] & 0x0F0) >> 4;
  1280.     blue  = (SavePalette[pen] & 0x00F) >> 0;
  1281.     SetRGB4(vp, pen, (LONG) red, (LONG) green, (LONG) blue);
  1282.     }
  1283.  
  1284.     else switch (gadget->GadgetID) {
  1285.     case COLOR_OK:
  1286.     CloseColorWindow((BOOL) TRUE);
  1287.     return FALSE;
  1288.     break;
  1289.     case COLOR_CANCEL:
  1290.     CloseColorWindow((BOOL) FALSE);
  1291.     return FALSE;
  1292.     break;
  1293.     case COLOR_COPY:
  1294.     if (RainbowMode) { /* Gadget now has an alternate meaning */
  1295.         if (++RainbowDistance > RAIN_MAX_DISTANCE)
  1296.         RainbowDistance = RAIN_MAX_DISTANCE;
  1297.         RRMax = -2;     /* Force color updating */
  1298.         ModifyColors();
  1299.     }
  1300.     else ColorMode = COPYCOLOR;
  1301.     break;
  1302.     case COLOR_RANGE:
  1303.     if (RainbowMode) {
  1304.         if (--RainbowDistance < RAIN_MIN_DISTANCE)
  1305.         RainbowDistance = RAIN_MIN_DISTANCE;
  1306.         RRMax = -3;     /* Force color updating */
  1307.         ModifyColors();
  1308.     }
  1309.     else ColorMode = RANGE_FIRST;
  1310.     break;
  1311.     case COLOR_AIN_RGB:
  1312.     /* blue = RemoveGList(ColorWindow,
  1313.         &ColorTemplateGadgets[COLOR_BLUE], 3L); */
  1314.     red = RemoveGadget(ColorWindow, &ColorTemplateGadgets[COLOR_RED]);
  1315.     green = RemoveGadget(ColorWindow,&ColorTemplateGadgets[COLOR_GREEN]);
  1316.     blue = RemoveGadget(ColorWindow, &ColorTemplateGadgets[COLOR_BLUE]);
  1317.     if (gadget->Flags & SELECTED) { /* We want Rainbow Mode */
  1318.         RainbowMode = TRUE;
  1319.         ColorTemplateGadgets[COLOR_COPY].GadgetText = &LessMoreText;
  1320.         ColorTemplateGadgets[COLOR_RANGE].GadgetText = &MoreLessText;
  1321.         RRMax = -4;     /* Force color updating */
  1322.         SetColorProps();
  1323.         ModifyColors();
  1324.     } else { /* We want our normal RGB mode back */
  1325.         RainbowMode = FALSE;
  1326.         ColorTemplateGadgets[COLOR_COPY].GadgetText =
  1327.         &ColorClusterText[0];
  1328.         ColorTemplateGadgets[COLOR_RANGE].GadgetText =
  1329.         &ColorClusterText[1];
  1330.         SetColorProps();
  1331.     }
  1332.     /* AddGList(ColorWindow, &ColorTemplateGadgets[COLOR_BLUE],
  1333.         (LONG) blue, 3L, NULL); */
  1334.     AddGadget(ColorWindow, &ColorTemplateGadgets[COLOR_BLUE],
  1335.         (LONG) blue);
  1336.     AddGadget(ColorWindow, &ColorTemplateGadgets[COLOR_GREEN],
  1337.         (LONG) green);
  1338.     AddGadget(ColorWindow, &ColorTemplateGadgets[COLOR_RED],
  1339.         (LONG) red);
  1340.     RefreshGadgets(&ColorTemplateGadgets[COLOR_GADGETS_COUNT - 1],
  1341.         ColorWindow);
  1342.     break;
  1343.  
  1344.     }
  1345.     return TRUE;
  1346. }
  1347.  
  1348. SHORT mod(a,b)
  1349. SHORT a,b;
  1350. {
  1351.     if (a < 0)  return a+b;
  1352.     if (a >= b) return a-b;
  1353.     return a;
  1354. }
  1355.  
  1356. ModifyColors()
  1357. {
  1358.     ULONG newred, newgreen, newblue;
  1359.  
  1360.     newred = ((struct PropInfo *)
  1361.     ColorTemplateGadgets[COLOR_RED].SpecialInfo)->HorizPot;
  1362.     newgreen = ((struct PropInfo *)
  1363.     ColorTemplateGadgets[COLOR_GREEN].SpecialInfo)->HorizPot;
  1364.     newblue = ((struct PropInfo *)
  1365.     ColorTemplateGadgets[COLOR_BLUE].SpecialInfo)->HorizPot;
  1366.  
  1367.     if (RainbowMode) {
  1368.     USHORT NewPalette[MAXCOL];
  1369.     SHORT i;
  1370.     SHORT distance;
  1371.  
  1372.     for (i=0; i<MAXCOL; i++)    NewPalette[i] = 0;
  1373.     NewPalette[0] = GetRGB4(vp->ColorMap, 0L);
  1374.     RainbowRMax = (newred * MaxColor + ONE_HALF) >> 16;
  1375.     RainbowGMax = (newgreen * MaxColor + ONE_HALF) >> 16;
  1376.     RainbowBMax = (newblue * MaxColor + ONE_HALF) >> 16;
  1377.  
  1378.     if (RainbowRMax == RRMax && RainbowGMax == RGMax &&
  1379.         RainbowBMax == RBMax) return;
  1380.  
  1381. #ifdef DEBUG2
  1382.     fprintf(stderr, "ModifyColors: d/r/g/b = %d %d %d %d\n",
  1383.         RainbowDistance,
  1384.         RainbowRMax,
  1385.         RainbowGMax,
  1386.         RainbowBMax);
  1387. #endif
  1388.  
  1389.     RRMax = RainbowRMax;
  1390.     RGMax = RainbowGMax;
  1391.     RBMax = RainbowBMax;
  1392.  
  1393.     for (distance=0; distance < RainbowDistance; distance++) {
  1394.         i = 15 - (16.0 * ((float) distance / RainbowDistance)) + 0.5;
  1395.         /* i = 15 - ((distance<<16)/RainbowDistance + (1<<11)) >> 12; */
  1396.         if (i < 0)  i = 0;
  1397.  
  1398.         NewPalette[1 + mod(RainbowBMax + distance, MaxColor)] |= i;
  1399.         NewPalette[1 + mod(RainbowBMax - distance, MaxColor)] |= i;
  1400.         i <<= 4;
  1401.         NewPalette[1 + mod(RainbowGMax + distance, MaxColor)] |= i;
  1402.         NewPalette[1 + mod(RainbowGMax - distance, MaxColor)] |= i;
  1403.         i <<= 4;
  1404.         NewPalette[1 + mod(RainbowRMax + distance, MaxColor)] |= i;
  1405.         NewPalette[1 + mod(RainbowRMax - distance, MaxColor)] |= i;
  1406.     }
  1407.  
  1408.     LoadRGB4(vp, &NewPalette[0], MaxColor + 1L);
  1409.     } else { /* Normal RGB mode */
  1410.     SetRGB4(vp, (ULONG) CurrentColor, newred >> 12, newgreen >> 12,
  1411.         newblue >> 12);
  1412.     }
  1413. }
  1414.  
  1415.  
  1416.  
  1417. STATIC DrawColorWindow()
  1418. {
  1419.     struct RastPort *RPort;
  1420.  
  1421.     RPort = ColorWindow->RPort;
  1422.  
  1423.     ColorRectFill(RPort, CurrentColor);
  1424.     SetAPen(RPort, 1L);
  1425.     SetDrMd(RPort, JAM1);
  1426.  
  1427.     /* Border around ColorBox */
  1428.     RectDraw(RPort, (SHORT) (COLOR_BOX_LEFT-2), (SHORT) (COLOR_BOX_TOP-2),
  1429.     (SHORT) (COLOR_BOX_RIGHT+2), (SHORT) (COLOR_BOX_BOTTOM+2));
  1430.     /* Border around ColorTemplateGadgets */
  1431.     RectDraw(RPort, (SHORT) (COLOR_BOX_LEFT-2), (SHORT) (COLOR_COLOR_TOP-2),
  1432.     (SHORT) (COLOR_BOX_LEFT+((MIN(MaxColor+1,8)*COLOR_COLOR_WIDTH)+1)),
  1433.     (SHORT) (COLOR_COLOR_TOP+(((MaxColor+8)/8)*COLOR_COLOR_HEIGHT)+1));
  1434. }
  1435.  
  1436.  
  1437.  
  1438. STATIC SetColorProps()
  1439. {
  1440.     ULONG rgb, red, green, blue;
  1441.  
  1442.     if (RainbowMode) {
  1443.     red   = ((ULONG) RainbowRMax << 16) / MaxColor;
  1444.     green = ((ULONG) RainbowGMax << 16) / MaxColor;
  1445.     blue  = ((ULONG) RainbowBMax << 16) / MaxColor;
  1446.     } else {
  1447.     rgb = GetRGB4(vp->ColorMap, (ULONG) CurrentColor);
  1448.     red   = (rgb & 0xF00) << 4  | (rgb & 0xF00) << 0;
  1449.     green = (rgb & 0x0F0) << 8  | (rgb & 0x0F0) << 4;
  1450.     blue  = (rgb & 0x00F) << 12 | (rgb & 0x00F) << 8;
  1451.     }
  1452.  
  1453.     ((struct PropInfo *)ColorTemplateGadgets[COLOR_RED]
  1454.     .SpecialInfo)->HorizPot
  1455.     = red;
  1456.     ((struct PropInfo *)ColorTemplateGadgets[COLOR_GREEN]
  1457.     .SpecialInfo)->HorizPot
  1458.     = green;
  1459.     ((struct PropInfo *)ColorTemplateGadgets[COLOR_BLUE]
  1460.     .SpecialInfo)->HorizPot
  1461.     = blue;
  1462. }
  1463.  
  1464.  
  1465. STATIC ColorRectFill(RPort, pen)
  1466. struct RastPort *RPort;
  1467. SHORT pen;
  1468. {
  1469.     SetAPen(RPort, (ULONG) pen);
  1470.     SetDrMd(RPort, (ULONG) JAM2);
  1471.     WaitBOVP(vp);
  1472.     RectFill(RPort, (ULONG) COLOR_BOX_LEFT, (ULONG) COLOR_BOX_TOP,
  1473.     (ULONG) COLOR_BOX_RIGHT, (ULONG) COLOR_BOX_BOTTOM);
  1474. }
  1475.  
  1476. #ifdef notdef
  1477.  
  1478. void Palette(w) /* DoColorWindow() */
  1479. struct Window *w;
  1480. {
  1481.     struct IntuiMessage *message;
  1482.     ULONG class;
  1483.     struct Gadget *gadget;
  1484.  
  1485.     if (NOT OpenColorWindow(w)) return;
  1486.  
  1487.     FOREVER {
  1488.     Wait( 1L << ColorWindow->UserPort->mp_SigBit );
  1489.     while (message = (struct IntuiMessage *)
  1490.         GetMsg(ColorWindow->UserPort)) {
  1491.         class = message->Class;
  1492.         gadget = (struct Gadget *)(message->IAddress);
  1493.         ReplyMsg(message);
  1494.  
  1495.         switch (class) {
  1496.         case GADGETDOWN:
  1497.         case GADGETUP:
  1498.         if (ColorGadgetGotten(gadget) == FALSE) return;
  1499.         break;
  1500.         case MOUSEMOVE:
  1501.         ModifyColors();
  1502.         break;
  1503.         }
  1504.     }
  1505.     }
  1506. }
  1507.  
  1508. #else
  1509.  
  1510. void HandleColorWindow(message)
  1511. struct IntuiMessage *message;
  1512. {
  1513.     ULONG class;
  1514.     struct Gadget *gadget;
  1515.  
  1516.     class = message->Class;
  1517.     gadget = (struct Gadget *)(message->IAddress);
  1518.     ReplyMsg(message);
  1519.  
  1520.     if (ColorWindow == NULL)
  1521.     return;
  1522.  
  1523.     switch (class) {
  1524.     case GADGETDOWN:
  1525.     case GADGETUP:
  1526.     if (ColorGadgetGotten(gadget) == FALSE) return;
  1527.     break;
  1528.     case MOUSEMOVE:
  1529.     ModifyColors();
  1530.     break;
  1531.     }
  1532. }
  1533.  
  1534. #endif
  1535.  
  1536. STATIC InitSuperColors()
  1537. {
  1538.     SHORT i;
  1539.  
  1540.     /* OK, initialize those Super Color Gadgets! */
  1541.     for (i = 0; i < MAXCOL; i++)
  1542.     {
  1543.     SuperColorImages[i].LeftEdge = 0;
  1544.     SuperColorImages[i].TopEdge = 0;
  1545.     SuperColorImages[i].Width = COLOR_COLOR_WIDTH;
  1546.     SuperColorImages[i].Height = 10;
  1547.     SuperColorImages[i].Depth = 0;
  1548.     SuperColorImages[i].ImageData = NULL;
  1549.     SuperColorImages[i].PlanePick = 0;
  1550.     SuperColorImages[i].PlaneOnOff = i;
  1551.     SuperColorImages[i].NextImage = NULL;
  1552.     }
  1553. }
  1554.